package com.gobang.controller;

import com.gobang.common.exception.ErrorCode;
import com.gobang.domain.message.GameStateRequestMessage;
import com.gobang.domain.message.HeartbeatResponseMessage;
import com.gobang.domain.message.MoveRequestMessage;
import com.gobang.service.ConnectionManagerService;
import com.gobang.service.MessageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Controller;

import java.security.Principal;

/**
 * WebSocket消息控制器
 * 职责：仅负责消息路由，不处理任何业务逻辑
 * 
 * @author System
 * @since 1.0.0
 */
@Controller
@RequiredArgsConstructor
@Slf4j
public class WebSocketMessageController {
    
    private final MessageService messageService;
    private final ConnectionManagerService connectionManagerService;
    
    /**
     * 接收落子请求消息并转发给游戏核心模块
     * 职责：消息路由，不处理业务逻辑
     */
    @MessageMapping("/game/move") // 将方法标记为 WS 消息处理器
    public void routeMoveRequest(MoveRequestMessage message, StompHeaderAccessor headerAccessor) {
        try {
            Long userId = getUserIdFromHeader(headerAccessor);
            log.info("路由落子请求：用户{}，房间{}，位置({},{})",
                    userId,
                    message.getData().getRoomId(),
                    message.getData().getRow(),
                    message.getData().getCol());

            // 更新用户活跃时间
            connectionManagerService.updateLastActive(userId);

            // 直接转发给游戏核心模块处理，并通过MessageService推送结果
            messageService.forwardMoveRequest(userId, message);
        } catch (Exception e) {
            log.error("路由落子请求异常", e);
            messageService.sendErrorResponse(getUserIdFromHeader(headerAccessor),
                ErrorCode.GAME_MOVE_INVALID, "消息路由失败");
        }
    }
    
    /**
     * 接收心跳响应消息并更新用户活跃状态
     * 职责：消息路由，不处理业务逻辑
     */
    @MessageMapping("/heartbeat")
    public void routeHeartbeatResponse(HeartbeatResponseMessage message, StompHeaderAccessor headerAccessor) {
        try {
            Long userId = getUserIdFromHeader(headerAccessor);
            log.debug("路由心跳响应：用户{}", userId);
            
            // 更新用户活跃时间
            connectionManagerService.updateLastActive(userId);
        } catch (Exception e) {
            log.error("路由心跳响应异常", e);
        }
    }
    
    /**
     * 接收游戏状态请求消息并转发给游戏核心模块
     * 职责：消息路由，不处理业务逻辑
     */
    @MessageMapping("/game/state")
    public void routeGameStateRequest(GameStateRequestMessage message, StompHeaderAccessor headerAccessor) {
        try {
            Long userId = getUserIdFromHeader(headerAccessor);
            log.info("路由游戏状态请求：用户{}，房间{}", userId, message.getData().getRoomId());

            // 更新用户活跃时间
            connectionManagerService.updateLastActive(userId);

            // 直接转发给游戏核心模块处理，并通过MessageService推送结果
            messageService.forwardGameStateRequest(userId, message.getData().getRoomId());
        } catch (Exception e) {
            log.error("路由游戏状态请求异常", e);
            messageService.sendErrorResponse(getUserIdFromHeader(headerAccessor),
                ErrorCode.GAME_ROOM_NOT_FOUND, "消息路由失败");
        }
    }
    
//    /**
//     * 接收匹配请求并转发给匹配系统模块
//     * 职责：消息路由，不处理业务逻辑
//     */
//    @MessageMapping("/match/join")
//    public void routeMatchRequest(StompHeaderAccessor headerAccessor) {
//        try {
//            Long userId = getUserIdFromHeader(headerAccessor);
//            log.info("路由匹配请求：用户{}", userId);
//
//            // 更新用户活跃时间
//            connectionManagerService.updateLastActive(userId);
//
//            // 直接转发给匹配系统模块处理，并通过MessageService推送结果
//            messageService.forwardMatchRequest(userId);
//        } catch (Exception e) {
//            log.error("路由匹配请求异常", e);
//            messageService.sendErrorResponse(getUserIdFromHeader(headerAccessor),
//                ErrorCode.MATCH_REQUEST_FAILED, "消息路由失败");
//        }
//    }
//
//    /**
//     * 接收取消匹配请求并转发给匹配系统模块
//     * 职责：消息路由，不处理业务逻辑
//     */
//    @MessageMapping("/match/cancel")
//    public void routeCancelMatchRequest(StompHeaderAccessor headerAccessor) {
//        try {
//            Long userId = getUserIdFromHeader(headerAccessor);
//            log.info("路由取消匹配请求：用户{}", userId);
//
//            // 更新用户活跃时间
//            connectionManagerService.updateLastActive(userId);
//
//            // 直接转发给匹配系统模块处理，并通过MessageService推送结果
//            messageService.forwardCancelMatchRequest(userId);
//        } catch (Exception e) {
//            log.error("路由取消匹配请求异常", e);
//            messageService.sendErrorResponse(getUserIdFromHeader(headerAccessor),
//                ErrorCode.MATCH_CANCEL_FAILED, "消息路由失败");
//        }
//    }
//
    /**
     * 从STOMP头中提取用户ID
     *
     * @param headerAccessor STOMP头访问器
     * @return 用户ID
     * @throws IllegalStateException 如果未找到用户信息
     */
    private Long getUserIdFromHeader(StompHeaderAccessor headerAccessor) {
        Principal user = headerAccessor.getUser();
        if (user != null) {
            try {
                return Long.parseLong(user.getName());
            } catch (NumberFormatException e) {
                throw new IllegalStateException("用户ID格式错误: " + user.getName());
            }
        }
        throw new IllegalStateException("未找到用户信息");
    }
} 